package com.learn.lb.zk;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * 创建zk会话的例子
 *
 * @author laibo
 * @since 2019/9/10 13:09
 */
public class CreateClientDemo {

    public static void main(String[] args) {
        /*
         * 重试策略
         * 随着重试次数增加重试时间间隔变大,指数倍增长baseSleepTimeMs * Math.max(1, random.nextInt(1 << (retryCount + 1)))。
         * 有两个构造方法
         * baseSleepTimeMs初始sleep时间
         * maxRetries最多重试几次
         * maxSleepMs最大的重试时间
         * 如果在最大重试次数内,根据公式计算出的睡眠时间超过了maxSleepMs，将打印warn级别日志,并使用最大sleep时间。
         * 如果不指定maxSleepMs，那么maxSleepMs的默认值为Integer.MAX_VALUE。
         */
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, Integer.MAX_VALUE);

        /*
         * 第一种方式创建
         * 默认的sessionTimeoutMs为60000
         * 默认的connectionTimeoutMs为15000
         */
        CuratorFramework curatorFramework1 = CuratorFrameworkFactory.newClient(ZkProperty.ZK_ADDRESS, retryPolicy);
        curatorFramework1.start();

        /*
         *
         */
        CuratorFramework curatorFramework2 = CuratorFrameworkFactory.newClient(ZkProperty.ZK_ADDRESS, ZkProperty.ZK_SESSION_TIMEOUT, ZkProperty.ZK_CONNECT_TIMEOUT, retryPolicy);
        curatorFramework2.start();


        /*
         * connectionString zk地址
         * sessionTimeoutMs 会话超时时间
         * connectionTimeoutMs 连接超时时间
         * namespace 每个curatorFramework 可以设置一个独立的命名空间,之后操作都是基于该命名空间，比如操作 /app1/message 其实操作的是/node1/app1/message
         * retryPolicy 重试策略
         */
        CuratorFramework curatorFramework3 = CuratorFrameworkFactory.builder()
                .connectString(ZkProperty.ZK_ADDRESS)
                .sessionTimeoutMs(ZkProperty.ZK_SESSION_TIMEOUT)
                .connectionTimeoutMs(ZkProperty.ZK_CONNECT_TIMEOUT)
                .namespace("app1")
                .retryPolicy(retryPolicy)
                .build();
        curatorFramework3.start();
    }
}
